﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Threading;

namespace SHomeWorkshop.LunarMind
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        /// <summary>
        /// 这个事件用于处理 WPF 4.0版在对剪贴板操作时存在的 Bug。
        /// 当剪贴板被其它程序占用（监视）时，WPF 4.0 就会出现异常。微软在.net 4.5中修正了这个问题。
        /// 但为了 Windows XP 中也能使用本程序，我只能将.net 版本锁定在 4.0——这是WinXP最后能支持一个.net 版本。
        /// 
        /// 事实上，这个办法的原理是反复尝试向剪贴板进行操作，仍然可能造成UI假死，并不是个完美的解决方案。
        /// 另，有人实测使用Clipboard.SetData()方法取代Clipboard.SetText()方法比较好用。
        /// 这个还需要进一步测试。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            var comException = e.Exception as System.Runtime.InteropServices.COMException;
            if (comException != null && comException.ErrorCode == -2147221040)///OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
                e.Handled = true;
        }

        void App_Startup(object sender, StartupEventArgs e)
        {
            // 解决Win10下菜单面板向左打开的问题。
            var ifLeft = SystemParameters.MenuDropAlignment;
            if (ifLeft)
            {
                var t = typeof(SystemParameters);
                var field = t.GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static);
                field.SetValue(null, false);
            }


            // 取命令行参数。
            if (e.Args.Length > 0)
            {
                Globals.cmdParameterString = e.Args[0];
            }

            Application.Current.SessionEnding += new SessionEndingCancelEventHandler(Current_SessionEnding);
        }

        /// <summary>
        /// 此事件用以在“文档被修改且未保存的情况下，直接关闭Windows时让用户有机会保存文件”。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void Current_SessionEnding(object sender, SessionEndingCancelEventArgs e)
        {
            if (this.MainWindow != null)
            {
                MainWindow win = this.MainWindow as MainWindow;
                if (win != null)
                {
                    if (win.CloseDocument() == false) e.Cancel = true;
                }
            }
        }
    }
}
